package com.dbms.parser.ast;

import com.dbms.common.Constants;
import com.dbms.common.Position;

/**
 * 事务控制语句（BEGIN, COMMIT, ROLLBACK）的抽象语法树（AST）节点。
 * <p>
 * 该节点用于在语法分析阶段表示一个事务操作。
 * 它继承自 {@link StatementNode}，是所有SQL语句AST节点的基类。
 */
public class TransactionNode extends StatementNode {

    /**
     * 定义了事务可以执行的命令类型。
     */
    public enum Command {
        /**
         * 开始一个新事务。
         */
        BEGIN,
        /**
         * 提交当前事务，将其更改永久化。
         */
        COMMIT,
        /**
         * 回滚当前事务，撤销其所有更改。
         */
        ROLLBACK
    }

    /**
     * 当前节点所代表的事务命令。
     */
    private final Command command;

    /**
     * 构造一个新的 TransactionNode 实例。
     *
     * @param position 该语句在原始SQL字符串中的位置信息。
     * @param command  要执行的事务命令（BEGIN, COMMIT, 或 ROLLBACK）。
     */
    public TransactionNode(Position position, Command command) {
        super(position);
        this.command = command;
    }

    /**
     * 获取此AST节点所代表的SQL语句的类型。
     *
     * @return 代表语句类型的字符串常量，例如 "BEGIN_TRANSACTION", "COMMIT", "ROLLBACK"。
     * 这些常量定义在 {@link Constants} 类中。
     */
    @Override
    public String getStatementType() {
        switch (command) {
            case BEGIN: return Constants.STATEMENT_BEGIN_TRANSACTION;
            case COMMIT: return Constants.STATEMENT_COMMIT;
            case ROLLBACK: return Constants.STATEMENT_ROLLBACK;
            default: throw new IllegalStateException("未知的事务命令");
        }
    }

    /**
     * 获取此节点封装的事务命令。
     *
     * @return {@link Command} 枚举实例，表示是哪种事务操作。
     */
    public Command getCommand() {
        return command;
    }
}